package com.gopay.common.util.xml.utils.validator;

import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * 统一验证类，由子类的validator()来实现，execute方法统一调度
 * @author liujy
 *
 */
public abstract class BaseValidator {
    /**
     * 数字检查. 长度大于1位. 只接受数字.
     */
    public static final String IS_NUMBER = "^[0-9]+$";
    public static int IP_LEN = 4;
    /** 虚拟卡号长度. */
    public static final int VIRCARDNO_LEN = 19;
    /** IP最大数字. */
    public static final int IP_MAX = 255;

    /**
     * 日期检查. yyyymmdd. 年：1600－9999. 会检查闰月.
     */
    public static final String IS_VALID_DATE_ONLYNUMBER = "^((1[6-9]|[2-9]\\d)?\\d{2})"
            + "(((0[13578]|1[02])31)|((0[1,3-9]|1[0-2])(29|30)))$|"
            + "^(((1[6-9]|[2-9]\\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))(0229)$|"
            + "^((1[6-9]|[2-9]\\d)?\\d{2})((0[1-9])|(1[0-2]))(0[1-9]|1\\d|2[0-8])$";
    /**
     * 6位时间检查. 时：00－23 . 分：00－59 . 秒：00－59.
     */
    public static final String IS_TIME = "^(([0-1][0-9])|(2[0-3]))([0-5][0-9])([0-5][0-9])$";

    /**
     * 金额检查. x代表至少1位数字，y代表1位数字. x 或 x.y 或 x.yy 如：'100', '0.2', '12.34'. 不接受 x. 或
     * 0x 如：'1.' , '05'.
     */
    public static final String IS_DECIMAL = "^(([1-9][0-9]*)|[0-9])((\\.(\\d{1,2}))|)$";

    /**
     * 所以校验器只做自己该做的事情 如果参数value为空，则返回true
     * 
     * @param validator_
     * @param value
     * @return
     */
    protected abstract boolean validator(Object validator_, Object value);

    public boolean execute(Object validator_, Object value) {
        return validator(validator_, value);
    }

    /**
     * 验证格式.
     * 
     * @param formValue
     *            需要验证的字符串
     * @param formatString
     *            格式名
     * @return boolean 1：合法，0：不合法
     */
    protected boolean validateFormat(String formValue, String formatString) {
        boolean match = true;
        if (formatString == null || formatString.trim().length() == 0) {
            return match;
        }
        try {
            match = Pattern.matches(formatString, formValue);
        } catch (PatternSyntaxException e) {
            e.printStackTrace();
            return false;
        }
        // add check character '
        if ((formValue.indexOf("'")) >= 0) {
            match = false;
        }
        return match;
    }
}
